using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public CaixamvtoVO getCaixamvto(int? idCaixaMvto, string mvto)
		{
			CaixamvtoVO caixamvtoVO = null;
			List<CaixamvtoVO> listCaixamvtoVOs = getCaixamvtos(idCaixaMvto, mvto, null, null, null, null, null, null, null, null);
			if (listCaixamvtoVOs != null && listCaixamvtoVOs.Count > 0)
			{
				caixamvtoVO = listCaixamvtoVOs[0];
			}
			return caixamvtoVO;
		}

		public CaixamvtoVO getCaixamvto(int? idCaixaMvto)
		{
			return getCaixamvto(idCaixaMvto, null);
		}

		public List<CaixamvtoVO> getCaixamvtos()
		{
			return getCaixamvtos(null, null, null, null, null, null, null, null, null, null);
		}

		public List<CaixamvtoVO> getCaixamvtos(int? idCaixaMvto)
		{
			return getCaixamvtos(idCaixaMvto, null, null, null, null, null, null, null, null, null);
		}

		public List<CaixamvtoVO> getCaixamvtos(int? idCaixaMvto, string mvto)
		{
			return getCaixamvtos(idCaixaMvto, mvto, null, null, null, null, null, null, null, null);
		}

		public List<CaixamvtoVO> getCaixamvtos(int? idCaixaMvto, string mvto, int? idCaixa, int? idCaixaTurno, DateTime? dtMvto, char? natureza, string nrDoc, char? origem, int? idColaboradorS, char? situacao)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT cxm.idCaixaMvto as cxm_idCaixaMvto, cxm.idCaixa as cxm_idCaixa, cxa.caixa as cxa_caixa, cxm.idCaixaTurno as cxm_idCaixaTurno, cxm.dtMvto as cxm_dtMvto, cxm.mvto as cxm_mvto, cxm.natureza as cxm_natureza, cxm.valor as cxm_valor, cxm.nrDoc as cxm_nrDoc, cxm.origem as cxm_origem, cxm.idColaboradorS as cxm_idColaboradorS, cxm.situacao as cxm_situacao, cxm.cadastro as cxm_cadastro, cxm.cadastradoPor as cxm_cadastradoPor, cxm.edicao as cxm_edicao, cxm.editadoPor as cxm_editadoPor  ");
			query.AppendLine("FROM caixamvto as cxm LEFT OUTER JOIN caixa as cxa on cxm.idCaixa=cxa.idCaixa  LEFT OUTER JOIN caixaturno as ctu on cxm.idCaixaTurno=ctu.idCaixaTurno  ");
			if (idCaixaMvto != null)
			{
				query.AppendLine(where + "cxm.idCaixaMvto=@idCaixaMvto ");
				where = "AND ";
			}
			if (idCaixa != null)
			{
				query.AppendLine(where + "cxm.idCaixa=@idCaixa ");
				where = "AND ";
			}
			if (idCaixaTurno != null)
			{
				query.AppendLine(where + "cxm.idCaixaTurno=@idCaixaTurno ");
				where = "AND ";
			}
			if (dtMvto != null)
			{
				query.AppendLine(where + "cxm.dtMvto=@dtMvto ");
				where = "AND ";
			}
			if (mvto != null)
			{
				query.AppendLine(where + "cxm.mvto LIKE @mvto ");
				where = "AND ";
			}
			if (natureza != null)
			{
				query.AppendLine(where + "cxm.natureza=@natureza ");
				where = "AND ";
			}
			if (nrDoc != null)
			{
				query.AppendLine(where + "cxm.nrDoc=@nrDoc ");
				where = "AND ";
			}
			if (origem != null)
			{
				query.AppendLine(where + "cxm.origem=@origem ");
				where = "AND ";
			}
			if (idColaboradorS != null)
			{
				query.AppendLine(where + "cxm.idColaboradorS=@idColaboradorS ");
				where = "AND ";
			}
			if (situacao != null)
			{
				query.AppendLine(where + "cxm.situacao=@situacao ");
				where = "AND ";
			}


            query.AppendLine("ORDER BY cxm.idCaixaMvto DESC ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idCaixaMvto!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixaMvto", idCaixaMvto));
			if (idCaixa!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixa", idCaixa));
			if (idCaixaTurno!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixaTurno", idCaixaTurno));
			if (dtMvto!= null) cmd.Parameters.Add(getParameter(cmd, "@dtMvto", dtMvto));
			if (mvto!= null) cmd.Parameters.Add(getParameter(cmd, "@mvto", "%"+mvto+"%"));
			if (natureza!= null) cmd.Parameters.Add(getParameter(cmd, "@natureza", natureza));
			if (nrDoc!= null) cmd.Parameters.Add(getParameter(cmd, "@nrDoc", nrDoc));
			if (origem!= null) cmd.Parameters.Add(getParameter(cmd, "@origem", origem));
			if (idColaboradorS!= null) cmd.Parameters.Add(getParameter(cmd, "@idColaboradorS", idColaboradorS));
			if (situacao!= null) cmd.Parameters.Add(getParameter(cmd, "@situacao", situacao));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<CaixamvtoVO> listCaixamvto = new List<CaixamvtoVO>();

				while (reader.Read())
				{
					CaixamvtoVO caixamvtoVO = CaixamvtoVO.CreateVO();
					caixamvtoVO.idCaixaMvto = reader.GetInt32(reader.GetOrdinal("cxm_idCaixaMvto"));
					caixamvtoVO.idCaixa = reader.GetInt32(reader.GetOrdinal("cxm_idCaixa"));
					if (!reader.IsDBNull(reader.GetOrdinal("cxa_caixa")))
						caixamvtoVO.idCaixaVO.caixa = reader.GetString(reader.GetOrdinal("cxa_caixa"));
					caixamvtoVO.idCaixaTurno = reader.GetInt32(reader.GetOrdinal("cxm_idCaixaTurno"));
					caixamvtoVO.dtMvto = reader.GetDateTime(reader.GetOrdinal("cxm_dtMvto"));
					caixamvtoVO.mvto = reader.GetString(reader.GetOrdinal("cxm_mvto"));
					caixamvtoVO.natureza = reader.GetChar(reader.GetOrdinal("cxm_natureza"));
					caixamvtoVO.valor = reader.GetDecimal(reader.GetOrdinal("cxm_valor"));
					if (!reader.IsDBNull(reader.GetOrdinal("cxm_nrDoc")))
						caixamvtoVO.nrDoc = reader.GetString(reader.GetOrdinal("cxm_nrDoc"));
					caixamvtoVO.origem = reader.GetChar(reader.GetOrdinal("cxm_origem"));
					if (!reader.IsDBNull(reader.GetOrdinal("cxm_idColaboradorS")))
						caixamvtoVO.idColaboradorS = reader.GetInt32(reader.GetOrdinal("cxm_idColaboradorS"));
					caixamvtoVO.situacao = reader.GetChar(reader.GetOrdinal("cxm_situacao"));
					caixamvtoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("cxm_cadastro"));
					caixamvtoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("cxm_cadastradoPor"));
					caixamvtoVO.edicao = reader.GetDateTime(reader.GetOrdinal("cxm_edicao"));
					caixamvtoVO.editadoPor = reader.GetString(reader.GetOrdinal("cxm_editadoPor"));


					listCaixamvto.Add(caixamvtoVO);
				}
				reader.Close();
				return listCaixamvto;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setCaixamvto(CaixamvtoVO caixamvtoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE caixamvto ");
			query.AppendLine("SET idCaixa=@idCaixa, idCaixaTurno=@idCaixaTurno, dtMvto=@dtMvto, mvto=@mvto, natureza=@natureza, valor=@valor, nrDoc=@nrDoc, origem=@origem, idColaboradorS=@idColaboradorS, situacao=@situacao,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idCaixaMvto=@idCaixaMvto ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixaMvto", caixamvtoVO.idCaixaMvto));
			cmd.Parameters.Add(getParameter(cmd, "@idCaixa", caixamvtoVO.idCaixa));
			cmd.Parameters.Add(getParameter(cmd, "@idCaixaTurno", caixamvtoVO.idCaixaTurno));
			cmd.Parameters.Add(getParameter(cmd, "@dtMvto", caixamvtoVO.dtMvto));
			cmd.Parameters.Add(getParameter(cmd, "@mvto", caixamvtoVO.mvto));
			cmd.Parameters.Add(getParameter(cmd, "@natureza", caixamvtoVO.natureza));
			cmd.Parameters.Add(getParameter(cmd, "@valor", caixamvtoVO.valor));
			if (caixamvtoVO.nrDoc == null)
				cmd.Parameters.Add(getParameter(cmd, "@nrDoc", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@nrDoc", caixamvtoVO.nrDoc));
			cmd.Parameters.Add(getParameter(cmd, "@origem", caixamvtoVO.origem));
			if (caixamvtoVO.idColaboradorS == null)
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorS", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorS", caixamvtoVO.idColaboradorS));
			cmd.Parameters.Add(getParameter(cmd, "@situacao", caixamvtoVO.situacao));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixamvtoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixamvtoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixamvtoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixamvtoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newCaixamvto(CaixamvtoVO caixamvtoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO caixamvto ");
			query.AppendLine("  ( idCaixa, idCaixaTurno, dtMvto, mvto, natureza, valor, nrDoc, origem, idColaboradorS, situacao, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @idCaixa, @idCaixaTurno, @dtMvto, @mvto, @natureza, @valor, @nrDoc, @origem, @idColaboradorS, @situacao, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixa", caixamvtoVO.idCaixa));
			cmd.Parameters.Add(getParameter(cmd, "@idCaixaTurno", caixamvtoVO.idCaixaTurno));
			cmd.Parameters.Add(getParameter(cmd, "@dtMvto", caixamvtoVO.dtMvto));
			cmd.Parameters.Add(getParameter(cmd, "@mvto", caixamvtoVO.mvto));
			cmd.Parameters.Add(getParameter(cmd, "@natureza", caixamvtoVO.natureza));
			cmd.Parameters.Add(getParameter(cmd, "@valor", caixamvtoVO.valor));
			if (caixamvtoVO.nrDoc == null)
				cmd.Parameters.Add(getParameter(cmd, "@nrDoc", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@nrDoc", caixamvtoVO.nrDoc));
			cmd.Parameters.Add(getParameter(cmd, "@origem", caixamvtoVO.origem));
			if (caixamvtoVO.idColaboradorS == null)
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorS", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorS", caixamvtoVO.idColaboradorS));
			cmd.Parameters.Add(getParameter(cmd, "@situacao", caixamvtoVO.situacao));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixamvtoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixamvtoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixamvtoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixamvtoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('caixamvto') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delCaixamvto(CaixamvtoVO caixamvtoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM caixamvto ");
			query.AppendLine("WHERE idCaixaMvto=@idCaixaMvto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixaMvto", caixamvtoVO.idCaixaMvto));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountCaixamvtoxIdCaixa(int? idCaixa)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCaixa) as ocorrencias FROM caixamvto WHERE IdCaixa=@IdCaixa ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCaixa", idCaixa));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountCaixamvtoxIdCaixaTurno(int? idCaixaTurno)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCaixaTurno) as ocorrencias FROM caixamvto WHERE IdCaixaTurno=@IdCaixaTurno ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCaixaTurno", idCaixaTurno));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
